package com.fengkai.filepost.pdfoutstream.test.ODsolutions;

import org.springframework.boot.actuate.endpoint.web.Link;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;

/**
 * @author Fengkai
 * @creat 2023/4/13
 * 题目描述
 * 网络信号经过传递会逐层衰减，且遇到阻隔物无法直接穿透，在此情况下需要计算某个位置的网络信号值。注意:网络信号可以绕过阻隔物
 * array[m][n] 的二维数组代表网格地图
 * array[i][j]=0代表i行j列是空旷位置;
 * array[i][j]=x(x为正整数)代表i行j列是信号源，信号强度是x;
 * array[i][j]=-1代表i行j列是阻隔物.
 * 信号源只有1个，阻隔物可能有0个或多个
 * 网络信号衰减是上下左右相邻的网格衰减 1
 * 现要求输出对应位置的网络信号值。
 * 输入描述
 * 输入为三行，第一行为 m、n，代表输入是一个mxn的数组。第二行是一串 m xn 如个用空格分隔的整数
 * 每连续n个数代表一行，再往后 n个代表下一行，以此类推。对应的值代表对应的网格是空矿位置，还是信号源，还是阻隔物。第三行是i、j，代表需要计算 array[i][j]的网络信号值。
 * 注意:此处i和j均从 0 开始，即第一行i 为 0
 * 输出描述
 * 输出对应位置的网络信号值，如果网络信号未覆盖到，也输出0。
 * 一个网格如果可以途径不同的传播衰减路径传达，取较大的值作为其信号值。
 * 示例1：
 * 输入：
 * 6 5
 * 0 0 0 -1 0 0 0 0 0 0 0 0 -1 4 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0
 * 1 4
 * 输出：
 * 2
 */
public class FindXinhaoQiangdu {

    public static void main (String[] args) {
        Scanner scanner = new Scanner(System.in);
        int m = scanner.nextInt();
        int n = scanner.nextInt();
        int[] nums = new int[m * n];
        for (int i = 0; i < m * n; i++) {
            nums[i] = scanner.nextInt();
        }
        int i = scanner.nextInt();
        int j = scanner.nextInt();
        System.out.println(getResult(m, n, nums, i, j));


    }

    public static int getResult (int m, int n, int[] nums, int i, int j) {
        if (nums.length != m * n) {
            return 0;
        }
        //用一个队列存储有信号的坐标  当前寻找信号源
        LinkedList<Integer[]> coordinates = new LinkedList<>();
        for (int k = 0; k < m; k++) {
            for (int l = 0; l < n; l++) {
                if (nums[k * n + l] > 1) {
                    //等于1也不用传播
                    coordinates.add(new Integer[]{k, l});
                    break;
                }
            }
        }
        //上下左右传播
        int[][] move = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};

        while (coordinates.size() > 0) {
            Integer[] integers = coordinates.removeFirst();
            Integer x = integers[0];
            Integer y = integers[1];

            for (int[] ints : move) {
                int x1 = x + ints[0];
                int y1 = y + ints[1];
                //nums[x1 * m + y1] 不等于0说明是障碍物
                if (x1 >= 0 && y1 >= 0 && x1 < m && y1 < n && nums[x1 * n + y1] == 0) {
                    //记录当前位置的信号强度
                    nums[x1 * n + y1] = nums[x * n + y] - 1;
                    if ( nums[x1 * n + y1] > 0){
                        coordinates.add(new Integer[]{x1, y1});
                        //一直循环  就能搜索到每个坐标的信号强度了
                    }
                }
            }
        }
        System.out.println(Arrays.toString(nums));

        return Math.max(nums[i * n + j], 0);
    }
}
